/* 
 * UnidadeController.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IBairroBO;
import br.com.pma.chamatec.business.IDepartamentoBO;
import br.com.pma.chamatec.business.IUnidadeBO;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.util.EnumResources;
import br.com.pma.entity.Bairro;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.UnidadeDepartamento;

/**
 * Controlador que representa o Caso de Uso Manter Unidade.
 *
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@ViewScoped
public class UnidadeController extends AbstractController {
	private static final long serialVersionUID = -500647107665943443L;

	@Inject
	private IUnidadeBO unidadeBO;

	@Inject
	private IBairroBO bairroBO;

	@Inject
	private IDepartamentoBO departamentoBO;

	@Inject
	private Unidade unidade;

	@Inject
	private Departamento departamento;
	
	@Inject
	private UnidadeDepartamento unidadeDepartamento;

	@Inject
	private Unidade unidadeSearch;

	private List<Unidade> unidades;
	private List<Bairro> bairros;
	private List<Departamento> departamentos;

	/**
	 * @see br.com.pma.chamatec.controller.AbstractController#init()
	 */
	@Override
	@PostConstruct
	public void init() {
		super.init();
		try {
			if (bairros == null || bairros.size() == 0) {
				bairros = bairroBO.getListDescricao();
			}

			if (departamentos == null || departamentos.size() == 0) {
				departamentos = departamentoBO.getListDescricao();
			}
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Envia para a página de cadastro de Unidade.
	 * 
	 */
	public void novo() {
		departamento = new Departamento();
		unidade = new Unidade();
		unidade.setUnidadesDepartamentos(new ArrayList<UnidadeDepartamento>());
		mostraCadastro();
		setIsCadastro(true);
	}

	/**
	 * Volta para a tela de cadastro.
	 * 
	 */
	public String cancelar() {
		limpar();
		return "index";
	}

	/**
	 * Limpa os campos de pesquisa e a datatable.
	 * 
	 */
	public void limpar() {
		unidades = null;
		Bairro bairro = new Bairro();
		unidadeSearch = new Unidade();
		unidadeSearch.setBairro(bairro);
		List<UnidadeDepartamento> lista = new ArrayList<UnidadeDepartamento>();
		unidadeSearch.setUnidadesDepartamentos(lista);
	}

	/**
	 * Retorna os dados da entidade Unidade.
	 * 
	 */
	public void pesquisar() {
		try {
			unidades = null;
			unidades = unidadeBO.pesquisar(unidadeSearch, usuarioBean.getUsuario());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Salva os dados da entidade Unidade.
	 * 
	 */
	public void salvar() {
		try {
			EnumResources msg = EnumResources.MS_004;
			if (unidade.getId() != null && unidade.getId() != 0) {
				msg = EnumResources.MS_005;
			}
			unidade = unidadeBO.salvar(unidade);
			unidade = new Unidade();

			addFacesMessage(msg);
			escondeCadastro();
			limpar();
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Envia para a tela de cadastro de Unidade.
	 * 
	 * @param unidade
	 */
	public void alterar(Unidade unidade) {
		mostraCadastro();
		try {
			unidadeBO.carregarUnidadeEDepartamento(unidade);
			this.unidade = unidade;
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Remove os dados da entidade Unidade.
	 * 
	 */
	public void remover() {
		try {
			unidadeBO.remover(unidade);
			pesquisar();
			addFacesMessage(EnumResources.MS_006);
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Adiciona uma lista de departamentos a Unidade.
	 * 
	 */
	public void addDepartamento() {
		try {
			unidadeBO.addDepartamento(this.unidade, this.departamento);
			addFacesMessage(EnumResources.MS_016);
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}
	
	/**
	 * Remove temas do Usuario.
	 */
	public void removerDepartamento() {
		unidade.getUnidadesDepartamentos().remove(unidadeDepartamento);
		addFacesMessage(EnumResources.MS_017);
	}
	/********************************************* Getters e Setters *****************************************************/
	/**
	 * @return the unidade
	 */
	public Unidade getUnidade() {
		return unidade;
	}

	/**
	 * @param unidade the unidade to set
	 */
	public void setUnidade(Unidade unidade) {
		this.unidade = unidade;
	}

	/**
	 * @return the departamento
	 */
	public Departamento getDepartamento() {
		return departamento;
	}

	/**
	 * @param departamento the departamento to set
	 */
	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	/**
	 * @return the unidadeDepartamento
	 */
	public UnidadeDepartamento getUnidadeDepartamento() {
		return unidadeDepartamento;
	}

	/**
	 * @param unidadeDepartamento the unidadeDepartamento to set
	 */
	public void setUnidadeDepartamento(UnidadeDepartamento unidadeDepartamento) {
		this.unidadeDepartamento = unidadeDepartamento;
	}

	/**
	 * @return the unidadeSearch
	 */
	public Unidade getUnidadeSearch() {
		return unidadeSearch;
	}

	/**
	 * @param unidadeSearch the unidadeSearch to set
	 */
	public void setUnidadeSearch(Unidade unidadeSearch) {
		this.unidadeSearch = unidadeSearch;
	}

	/**
	 * @return the unidades
	 */
	public List<Unidade> getUnidades() {
		return unidades;
	}

	/**
	 * @param unidades the unidades to set
	 */
	public void setUnidades(List<Unidade> unidades) {
		this.unidades = unidades;
	}

	/**
	 * @return the bairros
	 */
	public List<Bairro> getBairros() {
		return bairros;
	}

	/**
	 * @param bairros the bairros to set
	 */
	public void setBairros(List<Bairro> bairros) {
		this.bairros = bairros;
	}

	/**
	 * @return the departamentos
	 */
	public List<Departamento> getDepartamentos() {
		return departamentos;
	}

	/**
	 * @param departamentos the departamentos to set
	 */
	public void setDepartamentos(List<Departamento> departamentos) {
		this.departamentos = departamentos;
	}
}